
package br.com.aeternu.controleatendimento.excel.atendimento;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import br.com.aeternu.controleatendimento.common.bean.CommonBean;
import br.com.aeternu.controleatendimento.common.ifc.IfcMensagemUsuario;
import br.com.aeternu.controleatendimento.common.ui.EasyOptionPane;
import br.com.aeternu.controleatendimento.excel.Excel;
import br.com.aeternu.controleatendimento.exception.ControleAtendimentoException;

public class ExcelAtendimento extends Excel
{

   private static Logger logger = Logger.getLogger(ExcelAtendimento.class);

   public ExcelAtendimento()
   {
      super();
   }

   public List<String> obterPeriodos() throws ControleAtendimentoException
   {
      List<String> periodoList = new ArrayList<String>();

      HSSFWorkbook workbook = obterPastaDeTrabalho();

      for (int i = 0; i < workbook.getNumberOfSheets(); i++)
      {
         HSSFSheet sheet = workbook.getSheetAt(i);

         try
         {
            sheetNameDateFormat.parse(sheet.getSheetName());
            periodoList.add(sheet.getSheetName());
         }
         catch (ParseException e)
         {
            logger.info("Planilha inválida para esta operação: " + sheet.getSheetName());
         }
      }

      return periodoList;
   }

   @Override
   public List<AtendimentoBean> obterRegistros() throws ControleAtendimentoException
   {
      return obterRegistros(new Date());
   }

   public List<AtendimentoBean> obterRegistros(Date periodo) throws ControleAtendimentoException
   {
      List<AtendimentoBean> registroBeanList = new ArrayList<AtendimentoBean>();

      HSSFWorkbook workbook = obterPastaDeTrabalho();

      String nomePlanilha = sheetNameDateFormat.format(periodo);

      HSSFSheet sheet = workbook.getSheet(nomePlanilha);

      for (Iterator<Row> rit = (Iterator<Row>) sheet.rowIterator(); rit.hasNext();)
      {
         HSSFRow row = (HSSFRow) rit.next();
         AtendimentoBean bean = new AtendimentoBean();

         // pulando o cabeçalho
         if (row.getRowNum() > 0 && row.getCell(0) != null)
         {
            if (row.getRowNum() == 1 && getDate(row.getCell(0)) == null)
            {
               // Primeira linha não possui dado válido
               throw new ControleAtendimentoException("Nenhum registro encontrado no período.");
            }

            bean.setLinha(row.getRowNum());
            bean.setDataAtendimento(getDate(row.getCell(0)));
            bean.setTurno(getString(row.getCell(1)));
            bean.setMedico(getString(row.getCell(2)));
            bean.setPaciente(getString(row.getCell(3)));
            bean.setTipoDeExame(getString(row.getCell(4)));
            bean.setCoordenacao(getString(row.getCell(5)));
            bean.setEmpresaParceira(getString(row.getCell(6)));
            bean.setParticular(getString(row.getCell(7)));
            bean.setConclusaoPendencia(getString(row.getCell(8)));
            bean.setQuantidade(getInteger(row.getCell(9)));

            registroBeanList.add(bean);
         }
      }

      return registroBeanList;
   }

   public List<AtendimentoBean> obterRegistros(String sheetName) throws ControleAtendimentoException
   {
      List<AtendimentoBean> registroBeanList = new ArrayList<AtendimentoBean>();

      try
      {
         registroBeanList = obterRegistros(sheetNameDateFormat.parse(sheetName));
      }
      catch (ParseException e)
      {
         logger.error(e.getMessage(), e);

         new ControleAtendimentoException(IfcMensagemUsuario.ERRO_CONVERSAO_NOME_PLANILHA);
      }

      return registroBeanList;
   }

   @Override
   public void atualiza(List<? extends CommonBean> beanList)
   {
      @SuppressWarnings("unchecked")
      List<AtendimentoBean> atendimentoBeanList = (List<AtendimentoBean>) beanList;

      for (AtendimentoBean bean : atendimentoBeanList)
      {
         atualiza(bean);
      }
   }

   @Override
   public void atualiza(CommonBean bean)
   {
      AtendimentoBean atendimentoBean = (AtendimentoBean) bean;

      try
      {
         HSSFWorkbook workbook = obterPastaDeTrabalho();

         HSSFSheet sheet = workbook.getSheet(sheetNameDateFormat.format(atendimentoBean.getDataAtendimento()));

         if (sheet == null)
         {
            criarNovaPlanilha(false, atendimentoBean.getDataAtendimento());
            workbook = obterPastaDeTrabalho();
            sheet = workbook.getSheet(sheetNameDateFormat.format(atendimentoBean.getDataAtendimento()));
         }

         if (sheet != null)
         {
            HSSFCellStyle cellStyle = getCellStyleGeral(workbook);
            HSSFRow row;
            HSSFCell cell;

            if (atendimentoBean.getLinha() > 0)
            {
               row = sheet.getRow(atendimentoBean.getLinha());
               // Data
               cell = row.getCell(0);
               cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
               cell.setCellValue(atendimentoBean.getDataAtendimento());
               cell.setCellStyle(cellStyle);
               // Turno
               cell = row.getCell(1);
               cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("General"));
               cell.setCellValue(atendimentoBean.getTurno());
               cell.setCellStyle(cellStyle);
               // Médico
               cell = row.getCell(2);
               cell.setCellValue(atendimentoBean.getMedico());
               cell.setCellStyle(cellStyle);
               // Paciente
               cell = row.getCell(3);
               cell.setCellValue(atendimentoBean.getPaciente());
               cell.setCellStyle(cellStyle);
               // Tipo de Exame
               cell = row.getCell(4);
               cell.setCellValue(atendimentoBean.getTipoDeExame());
               cell.setCellStyle(cellStyle);
               // Coordenação
               cell = row.getCell(5);
               cell.setCellValue(atendimentoBean.getCoordenacao());
               cell.setCellStyle(cellStyle);
               // Empresa Parceira
               cell = row.getCell(6);
               cell.setCellValue(atendimentoBean.getEmpresaParceira());
               cell.setCellStyle(cellStyle);
               // Particular
               cell = row.getCell(7);
               cell.setCellValue(atendimentoBean.getParticular());
               cell.setCellStyle(cellStyle);
               // Conclusão/Pendência
               cell = row.getCell(8);
               cell.setCellValue(atendimentoBean.getConclusaoPendencia());
               cell.setCellStyle(cellStyle);
               // Quantidade
               cell = row.getCell(9);
               cell.setCellValue(atendimentoBean.getQuantidade());
               cell.setCellStyle(cellStyle);
            }
            else
            {
               row = sheet.createRow(sheet.getLastRowNum() + 1);
               atendimentoBean.setLinha(sheet.getLastRowNum());
               // Data
               cell = row.createCell(0);
               cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
               cell.setCellValue(atendimentoBean.getDataAtendimento());
               cell.setCellStyle(cellStyle);
               // Turno
               cell = row.createCell(1);
               cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("General"));
               cell.setCellValue(atendimentoBean.getTurno());
               cell.setCellStyle(cellStyle);
               // Médico
               cell = row.createCell(2);
               cell.setCellValue(atendimentoBean.getMedico());
               cell.setCellStyle(cellStyle);
               // Paciente
               cell = row.createCell(3);
               cell.setCellValue(atendimentoBean.getPaciente());
               cell.setCellStyle(cellStyle);
               // Tipo de Exame
               cell = row.createCell(4);
               cell.setCellValue(atendimentoBean.getTipoDeExame());
               cell.setCellStyle(cellStyle);
               // Coordenação
               cell = row.createCell(5);
               cell.setCellValue(atendimentoBean.getCoordenacao());
               cell.setCellStyle(cellStyle);
               // Empresa Parceira
               cell = row.createCell(6);
               cell.setCellValue(atendimentoBean.getEmpresaParceira());
               cell.setCellStyle(cellStyle);
               // Particular
               cell = row.createCell(7);
               cell.setCellValue(atendimentoBean.getParticular());
               cell.setCellStyle(cellStyle);
               // Conclusão/Pendência
               cell = row.createCell(8);
               cell.setCellValue(atendimentoBean.getConclusaoPendencia());
               cell.setCellStyle(cellStyle);
               // Quantidade
               cell = row.createCell(9);
               cell.setCellValue(atendimentoBean.getQuantidade());
               cell.setCellStyle(cellStyle);
            }

            gravar(workbook);

            logger.info(sheet.getSheetName() + ": Linha " + atendimentoBean.getLinha() + " atualizada com sucesso!");
         }
         else
         {
            EasyOptionPane.showErrorMessageDialog(null,
               "Planilha não encontrada: " + sheetNameDateFormat.format(atendimentoBean.getDataAtendimento()));
         }
      }
      catch (ControleAtendimentoException e)
      {
         logger.error(e.getMessage(), e);
      }
      catch (FileNotFoundException e)
      {
         logger.error(e.getMessage(), e);
      }
      catch (IOException e)
      {
         logger.error(e.getMessage(), e);
      }
   }

   @Override
   protected HSSFSheet getSheet() throws ControleAtendimentoException
   {
      HSSFWorkbook workbook = obterPastaDeTrabalho();

      return getSheet(workbook);
   }

   @Override
   protected HSSFSheet getSheet(HSSFWorkbook workbook) throws ControleAtendimentoException
   {
      return null;
   }
}
